package com.second.app.thread.线程基础.day02;

/**
 * @Author GYZ
 * @Date 2023/11/17
 * <pre>
 *  如何去停止线程
 *    1.stop()：确实可以停止一个正在使用的线程，但是最好不用，因为这个方法不安全，而且是已经被弃用作废的
 *    2.大多数停止一个线程的操作使用Thread.interrupt()方法，但是这个方法不会终止一个正在运行的线程。
 *      案例1：比如输出i：50万次，中断线程，但是线程并没有停下来。
 *            还需要再加入一个判断才可以完成线程的停止。
 *
 *    this.interrupted():测试 (当前线程)是否已经中，当前线程是指运行this.interrupted()的线程
 *    案例2：从控制台打印的结果，线程并未停止，证明了interrupted(),是测试当前线程是否已经中断。
 *          当前线程是main,所以从未中断过。
 *    案例3：如何使main线程产生中断效果?
 *          为什么一个是true，一个false？
 *          因为interrupted()方法具有清除状态的功能，所以第二次调用interrupted()方法返回值为false。
 *
 *   this.isInterrupted():测试 (线程)是否已经中断。测试线程对象是否已经中断
 *   案例4：结果是2个true。说明isInterrupted不会清除状态标志。
 *
 *   案例5：如何停止线程（异常法）
 *
 *   案例6：在沉睡中停止
 *         从打印结果看，在sleep状态下停止某一线程，会进入catch语句，并且清除状态值，变为false;
 *
 *   除此之外，还有个暴力停止线程的方法（stop()）
 *
 *
 * </pre>
 */
public class StopThreadDemo {

    public static void main(String[] args) {
//        class InterruptThread extends Thread {
//            @Override
//            public void run() {
//                for (int i = 0; i < 500000; i++) {
//                    System.out.println("线程名称：" + Thread.currentThread().getName() + "打印i=" + (i + 1));
//                }
//            }
//        }
        //案例1
//        try {
//            Thread thread = new Thread(new InterruptThread(), "线程A");
//            thread.start();
//            Thread.sleep(2000);
//            thread.interrupt();
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
        //案例2
//        try {
//            InterruptThread interruptThread = new InterruptThread();
//            interruptThread.start();
//            Thread.sleep(1000);
//            interruptThread.interrupt();
//            System.out.println("是否停止1？="+interruptThread.interrupted());//false
//            System.out.println("是否停止2？="+interruptThread.interrupted());//false
//        } catch (InterruptedException e) {
//            System.out.println("main catch");
//            throw new RuntimeException(e);
//        }
        //案例3
//        Thread.currentThread().interrupt();
//        System.out.println("是否停止1？="+Thread.interrupted());
//        System.out.println("是否停止2？="+Thread.interrupted());
//        System.out.println("end!");
        //案例4
//        try {
//            InterruptThread thread = new InterruptThread();
//            thread.start();
//            Thread.sleep(1000);
//            thread.interrupt();
//            System.out.println("是否停止1？=" + thread.isInterrupted());
//            System.out.println("是否停止2？=" + thread.isInterrupted());
//        } catch (InterruptedException e) {
//            System.out.println("main catch");
//            throw new RuntimeException(e);
//        }
        //方案5
//        class InterruptThread extends Thread {
//            @Override
//            public void run() {
//                try {
//                    for (int i = 0; i < 500000; i++) {
//                        if (this.isInterrupted()) {
//                            System.out.println("已经是停止状态，我要退出了！！！");
//                            throw new InterruptedException();
//                        }
//                        System.out.println("线程名称：" + Thread.currentThread().getName() + "打印i=" + (i + 1));
//                    }
//                } catch (InterruptedException e) {
//                    System.out.println("进入 run 方法的 catch了");
//                    e.printStackTrace();
//                }
//            }
//        }
//        try {
//            InterruptThread thread = new InterruptThread();
//            thread.start();
//            Thread.sleep(1000);
//            thread.interrupt();
//        } catch (InterruptedException e) {
//            System.out.println("main catch");
//            e.printStackTrace();
//        }
        //方案6
        class InterruptThread extends Thread {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    System.out.println("在沉睡中被停止，进入catch!"+this.isInterrupted());
                    throw new RuntimeException(e);
                }
            }
        }
        try {
            InterruptThread interruptThread = new InterruptThread();
            interruptThread.start();
            Thread.sleep(200);
            interruptThread.interrupt();
            System.out.println("interruptThread isInterrupted"+interruptThread.isInterrupted());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("main-------end ");
    }
}
